#include <stdio.h>
#include <fcntl.h>  
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <bits/fcntl-linux.h>
#include <stdlib.h>
#include "lcd.h"

#define WIDTH 800
#define HIGHT 480

enum Colors{
    WHITE = 0x00ffffff,
    RED = 0x00ff0000,
    GREEN = 0x0000ff00,
    BLUE = 0x000000ff,
    BLACK = 0x00000000,
}Colors;



int drawACir(int lcdFd,int cx,int cy,int radius){
    // int lcdFd = open("/dev/fb0",O_RDWR);
    // if(lcdFd == -1)
    // {
    //     printf("open lcd error\n");
    //     return -1;
    // }
    // int (*lcdP)[800] = (int(*)[800])mmap(NULL, //你要映射的内存空间的起始地址，为NULL系统自动给你分配
    //      WIDTH*HIGHT*4,//你要映射的内存空间的大小
    //      PROT_READ|PROT_WRITE,//映射的权限 
    //      MAP_SHARED,//1、进程共享  2、对应的文件会同步发生变化     
    //      lcdFd,//映射液晶屏文件
    //      0//偏移量 ，默认为0
    //     );
    
    for (int x = cx - radius; x < cx + radius; x++) {  
        for (int y = cy - radius; y < cy + radius; y++) {  
            // 计算当前点到圆心的距离的平方  
            int dx = x - cx;  
            int dy = y - cy;  
            int distance_squared = dx * dx + dy * dy;  
  
            // 如果点在圆内且位于画布内，则将其设置为黑色 
            if (distance_squared <= radius * radius && x >= 0 && x < WIDTH && y >= 0 && y < HIGHT) {  
                lcdP[y][x] = BLACK;
            }  
        }  
    }


    // munmap(lcdP, WIDTH*HIGHT*4);
    //3、关闭文件
    // close(lcdFd); 
}

int clearScreen(int lcdfd){
    int colorbuf[WIDTH*HIGHT];
    int i;
    // int lcdfd = open("/dev/fb0",O_RDWR);
    // if(lcdfd == -1)
    // {
    //     printf("open lcd error\n");
    //     return -1;
    // }
    //将液晶屏文件 通过内存映射mmap的方式 映射到虚拟内存空间的某一块空间上，得到这一块内存的起始地址，后续我们操作这片内存空间，就相当于直接操作液晶屏文件
    int *lcd_p1 = mmap(NULL, //你要映射的内存空间的起始地址，为NULL系统自动给你分配
         WIDTH*HIGHT*4,//你要映射的内存空间的大小
         PROT_READ|PROT_WRITE,//映射的权限 
         MAP_SHARED,//1、进程共享  2、对应的文件会同步发生变化     
         lcdfd,//映射液晶屏文件
         0//偏移量 ，默认为0
        );
    //int lcd_p[WIDTH*HIGHT];    ---液晶屏数组
    if(lcd_p1 == MAP_FAILED)
    {
        printf("mmap lcd error\n");
        return -1;
    }
    //相当于直接操作液晶屏文件lcd_p
    for(i=0; i<WIDTH*HIGHT; i++)
    {
        lcd_p1[i] = WHITE;
    }
    
    //解除映射
    munmap(lcd_p1, WIDTH*HIGHT*4);
    //3、关闭文件
    // close(lcdfd);
}

int initLcd(int *lcdfd){
    *lcdfd = open("/dev/fb0",O_RDWR);

    if(*lcdfd == -1)
    {
        printf("open lcd error\n");
        return -1;
    }

    lcdP = (int(*)[800])mmap(NULL, //你要映射的内存空间的起始地址，为NULL系统自动给你分配
         WIDTH*HIGHT*4,//你要映射的内存空间的大小
         PROT_READ|PROT_WRITE,//映射的权限 
         MAP_SHARED,//1、进程共享  2、对应的文件会同步发生变化     
         *lcdfd,//映射液晶屏文件
         0//偏移量 ，默认为0
        );

    clearScreen(*lcdfd);
    return 1;
}

// //画一个线段
// void lcd_draw_line(int lcdfd,int x1,int y1,int x2,int y2)
// {

// }

void drawALine(int x1,int x2,int y1,int y2,int lcdFd,int radius){
 
    int dx = abs(x2 - x1), sx = x1 < x2 ? 1 : -1;  
    int dy = abs(y2 - y1), sy = y1 < y2 ? 1 : -1;  
    int err = dx - dy;  
  
    while (1) {  
        // 设置当前像素   
        drawACir(lcdFd,x1,y1,radius);
        if (x1 == x2 && y1 == y2) break;  
        else if (err > 0) {  
            err -= 2 * dy;  
            x1 += sx;  
        } else {  
            err += 2 * dx;  
            y1 += sy;  
        }  
    }
    
}

int setUI(){
    
}